package cn.netuo.bumbersoll;

import android.content.Context;
import android.content.Intent;
import android.support.multidex.MultiDex;
import android.text.TextUtils;
import android.util.ArrayMap;

import com.rooten.BaApp;
import com.rooten.Constant;
import com.rooten.help.apploop.AppLoopService;
import com.rooten.help.apploop.loopentity.TaskItem;
import com.rooten.help.filehttp.FileDownloadMgr;
import com.rooten.help.filehttp.FileUploadMgr;
import com.tencent.bugly.beta.Beta;

import java.util.ArrayList;
import java.util.List;

import cn.netuo.bumbersoll.db.TableMgr;
import cn.netuo.bumbersoll.entity.VideoAd;
import cn.netuo.bumbersoll.helper.ble.BLEHelper;
import cn.netuo.bumbersoll.util.BatteryHelper;
import cn.netuo.bumbersoll.util.BuglyUtil;
import lib.grasp.util.AppUtil;

/**
 * 业务Application
 */
public class App extends BaApp{

    /** APPLICATION */
    public static App app;

    /** DB管理类 */
    private TableMgr mTableMgr;

    /** 低功耗蓝牙帮助类 */
    private BLEHelper mBLEHelper;

    /** 文件上传管理 */
    private FileUploadMgr mFileUploadMgr = null;
    /** 文件下载管理 */
    private FileDownloadMgr mFileDownloadMgr = null;

    /** 下载视频线程ID */
    public  String          mDownLoadId;

    /** 电池电量监听 */
    private BatteryHelper mBatteryReceiver = new BatteryHelper();


    /**
     * 本期视频下载列表<文件url, 文件实体/>
     * 1. 轮询线程或者Mqtt广告视频推送会从DB里获取[最新的, 未下载的]一批视频;<br/>
     * 2. 用最新的视频列表来跟当前Map列表比对:<br/>
     *  1): DB列表(任意一项)晚于Map列表, 则全部更新Map列表, 全部加入下载队列, 同时清空老的临时下载目录, 重整已下载的视频(有用的则留, 没用的则删);<br/>
     *  2): 获取出DB列表中异于Map列表的项, 加入下载队列
     */
    public ArrayMap<String, VideoAd> mVideoLoadTasks = new ArrayMap<>();

    @Override
    public void onCreate() {
        super.onCreate();
        App.app = this;
//        doInit();
    }

    public void doInit(){
        BuglyUtil.initBugly();
        initLoad();
    }

    /** 初始化传输类 */
    private void initLoad(){
        mFileUploadMgr      = new FileUploadMgr(0);             // 文件上传管理器
        mFileDownloadMgr    = new FileDownloadMgr(1);           // 文件上传管理器
    }

    public BatteryHelper getBatteryReceiver() {
        return mBatteryReceiver;
    }

    public FileUploadMgr getFileUploadMgr() {
        return mFileUploadMgr;
    }

    public FileDownloadMgr getFileDownloadMgr() {
        return mFileDownloadMgr;
    }

    public static App getApp() {
        return App.app;
    }

    public TableMgr getTableMgr() {
        if(mTableMgr == null) mTableMgr = new TableMgr();
        return mTableMgr;
    }

    public BLEHelper getBLEHelper() {
        return mBLEHelper;
    }

    public void setBLEHelper(BLEHelper mBLEHelper) {
        this.mBLEHelper = mBLEHelper;
    }

    public void startAppOnService(TaskItem item) {
        Intent mIntent = new Intent();
        mIntent.setPackage(getPackageName());
        mIntent.setAction(Constant.ARG_ACTION_REMOTE_SERVICE);
        Intent eintent = new Intent(AppUtil.getExplicitIntent(this, mIntent));
        if(item != null){
            eintent.putExtra("operationId"      , 1);                       // 新增任务
            eintent.putExtra("broadcastStr"     , item.broadCast);          // 广播内容
            eintent.putExtra("intervalSecond"   , item.intervalSecond);     // 广播间隔
        }
        startService(eintent);
    }

    public void stopCertainLoopTask(String broadcast) {
        if(TextUtils.isEmpty(broadcast)) return;
        Intent mIntent = new Intent();
        mIntent.setPackage(getPackageName());
        mIntent.setAction(Constant.ARG_ACTION_REMOTE_SERVICE);
        Intent eintent = new Intent(AppUtil.getExplicitIntent(this, mIntent));
        eintent.putExtra("operationId"      , 0);                   // 删除任务
        eintent.putExtra("broadcastStr"     , broadcast);           // 广播内容
        startService(eintent);
    }

    public void stopAppOnService() {
        Intent intent = new Intent(this, AppLoopService.class);
        stopService(intent);
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);     // 分dex
        Beta.installTinker();       // 安装tinker
    }

    /** 获取正在播放的视频列表 */
    public List<String> getVideos(){
        List<String> list = new ArrayList<>();
        if(App.getApp().mVideoLoadTasks == null || App.getApp().mVideoLoadTasks.size() == 0) return list;
        for(VideoAd videoAd : App.getApp().mVideoLoadTasks.values()){
            list.add(videoAd.name);
        }
        return list;
    }
}
